#include <iostream>
#include <vector>
#include <algorithm>  // 用于 std::remove
#include <string>

// 观察者接口，所有观察者都要实现这个接口
class Observer {
    public:
    virtual void Update(int data) = 0; // 更新接口
};

// 主题（被观察者）接口，主题需要维护观察者列表，并提供添加、删除观察者的接口
class Subject {
    public:
    virtual void attach(Observer* observer) = 0; // 添加观察者
    virtual void detach(Observer* observer) = 0; // 移除观察者
    virtual void notify() = 0;                   // 通知观察者
};

// 具体观察者，更新自身状态以反映主题的变化
class ConcreteObserver : public Observer {
    public:
    ConcreteObserver(const std::string& name):name_(name),observedState_(0) {}
    virtual void Update(int data) {
        observedState_ = data;
        std::cout << "Observer " << name_ << "updated with state: " << observedState_ << std::endl;
    }
    private:
    std::string name_;  // 观察者名称
    int observedState_;  // 观察者的状态
};

// 具体主题，维护观察者列表和状态，并在状态变化时通知观察者
class ConcreteSubject : public Subject {
    public:
    virtual void attach(Observer* observer) {
        observers_.push_back(observer); // 添加被观察者
    }

    virtual void detach(Observer* observer) {
        observers_.erase(std::remove(observers_.begin(),observers_.end(),observer),observers_.end());  // 移除观察者
    }

    virtual void notify() {
        for(Observer* observer : observers_) {
            observer->Update(state_); // 通知所有观察者
        }
    }

    void setState(int newState) {
        state_ = newState;  // 更新状态
        notify();
    }
    
    int getState() const{
        return state_;  // 获取当前状态
    }
    private:
    std::vector<Observer*> observers_;  // 观察者列表
    int state_; // 主题的状态
};

int main() {
    std::cout << "hello observer pattern!!!" << std::endl;
    ConcreteSubject subject; // 创建具体主题

    ConcreteObserver obsserver1("Observer 1"); // 创建观察者1
    ConcreteObserver obsserver2("Observer 2"); // 创建观察者2

    subject.attach(&obsserver1); // 注册观察者1
    subject.attach(&obsserver2); // 注册观察者2

    subject.setState(1);
    subject.setState(2);
    return 0;
}